package Thread;

import java.util.concurrent.CountDownLatch;

//CountDownLatch
public class Demo28 {
    public static void main(String[] args) throws InterruptedException {
        //在构造方法中定义将任务分为10个模块进行执行
        CountDownLatch countDownLatch = new CountDownLatch(10);
        //创建10个线程分别去执行这些任务
        for (int i = 0; i < 10; i++) {
            int id = i;//这样id没有被改变，相当于常量
            Thread t = new Thread(()->{
//                System.out.println("线程"+i+"开始工作");//直接使用i涉及到变量捕获，匿名表达式变量捕获只能捕获final类型的变量，即常量
                System.out.println("线程"+id+"开始工作");
                try {
                    Thread.sleep(1000);//指定某些耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程"+id+"结束工作");
                //看当前这个线程是否完成任务。
                // 把 10 个线程想象成短跑比赛的 10 个运动员. countDown 就是运动员撞线了.
                countDownLatch.countDown();
            });
            t.start();
        }
        //CountDownLatch等到全部任务都被执行完
        // 主线程中可以使用 countDownLatch 负责等待任务结束.
        // a => all 等待所有任务结束. 当调用 countDown 次数 < 初始设置的次数, await 就会阻塞.
        countDownLatch.await();
        System.out.println("多个线程的所有任务都执行完毕");
    }
}
